#pragma once

#include "Icharacters.hh"
#include <string>
#include "../Utils/include/json.hpp"

using json = nlohmann::json;

// 敌人类,继承自角色基类
class Enemy : public ICharacter {
private:
    int id_;                // 敌人ID
    std::string name_;      // 敌人名称
    int hp_;               // 生命值
    int atk_;              // 攻击力
    int def_;              // 防御力
    int speed_;            // 速度值（闪避率），取值范围 0~100
    bool isDefeated_ = false;      // 是否被击败

public:
    // 构造和析构函数
    Enemy() = default;
    Enemy(const Enemy& other);
    Enemy& operator=(const Enemy& other);
    ~Enemy();
    Enemy(int id, const std::string& name, int hp, int atk, int def, int speed);

    // 重写角色基类的虚函数
    bool isAlive() const override;                    // 判断是否存活
    bool takeDamage(unsigned damage) override;        // 受到伤害
    bool attack(ICharacter& target) override;         // 攻击目标

    // 获取基本属性
    std::string getName() const override;             // 获取名称
    std::string getDescription() const override;      // 获取描述
    unsigned getHealth() const override;              // 获取生命值
    unsigned getAttack() const override;              // 获取攻击力
    unsigned getDefense() const override;             // 获取防御力
    std::string toString() const override;            // 转为字符串表示

    int getID() const;                               // 获取ID
    void addToInventory(Item* item) override;        // 添加物品到背包(空实现)
    void displayInventory() const override;          // 显示背包内容(空实现)

    void display() const override;                   // 显示敌人状态

    // 击败状态相关
    bool isDefeated() const;                         // 是否被击败
    void setDefeated(bool defeated);                 // 设置击败状态
    
    // 速度相关
    int getSpeed() const;                            // 获取速度值
    void setSpeed(int speed);                        // 设置速度值

    friend void from_json(const json& j, Enemy& e);  // JSON序列化支持
};

// JSON反序列化函数
void from_json(const json& j, Enemy& e);